import pyautogui
import time
import pyperclip as clip
import json
import pandas as pd
from datetime import datetime
from sqlalchemy import create_engine
import pypinyin
from bs4 import BeautifulSoup
import random
from jsjj.util.configUtil import *
import traceback
from jsjj.util.emailUtil import *
import os

modeName = ''
runMode = ''
# 这段代码是不需要阿明插件的
# 原时旗舰店(少)
# 立太友泰专卖店
# 第一种风格的店铺
shopName = '立太友泰专卖店'


def saveJson(jsonFromPDD, con):
    print("******保存一次数据******")
    dfLoop = pd.read_json(json.dumps(jsonFromPDD['goods_list']))
    dfLoop = dfLoop.drop(columns=['group', 'tag_list', 'prop_tag_list', 'p_rec', 'goods_icon_list'])
    dfLoop['分类'] = ''
    # 原时旗舰店
    # 立太友泰专卖店
    dfLoop['店铺名称'] = shopName
    dfLoop['阿明工具断点续传标志'] = '0'
    dfLoop['当前页数'] = jsonFromPDD['page_no']
    # 解决可能出现的超时问题bugfix 2020.08.18
    con.connection.connection.ping(reconnect=True)
    # 拼多多_竞争对手商品信息
    dfLoop.to_sql(name='拼多多_竞争对手商品信息_debug', con=con, if_exists='append', index=False)


# 尝试通过最安全的方式来获取拼多多【主网站】的商品信息
def SPGK(conn):
    # 保护措施，避免失控
    pyautogui.FAILSAFE = False
    # 为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。
    pyautogui.PAUSE = 0.2

    # 左边--【物流工具】
    sleep(6)
    pyautogui.scroll(10000)
    # for z in range(1, int(10000 / 1000)):
    #     pyautogui.scroll(1000)
    #     sleep(0.1)

    sleep(4)
    pyautogui.keyDown('f12')
    pyautogui.keyUp('f12')

    # # 首页 tab 页
    # pyautogui.moveTo(597, 558, 4)
    # pyautogui.click()

    # 全部商品
    pyautogui.moveTo(768, 557, 4)
    pyautogui.click()

    # 清除network
    pyautogui.moveTo(1544, 145, 4)
    pyautogui.click()

    sleep(2)
    pyautogui.keyDown('f5')
    pyautogui.keyUp('f5')

    # 到filter 的textbox
    pyautogui.moveTo(1522, 168, 4)
    pyautogui.doubleClick()

    #
    clip.copy('query_cat_goods')  # 先复制
    pyautogui.hotkey('ctrl', 'v')  # 再粘贴

    # 选中过滤文件（第一次）
    pyautogui.moveTo(1540, 325, 2)
    pyautogui.click()

    # 点中json值区域
    pyautogui.moveTo(1812, 497, 2)
    pyautogui.click()

    sleep(2)
    pyautogui.hotkey('ctrl', 'a')

    sleep(2)
    pyautogui.hotkey('ctrl', 'c')

    # bug fix，到第一个页面可能会被遮住
    pyautogui.moveTo(1571, 167, 2)

    # 读取剪切板内容（第一次）
    sleep(2)
    value = clip.paste()
    jsonFromPDD = json.loads(value)
    saveJson(jsonFromPDD, conn)

    shouldContinue = True

    # 上面的代码是第一次的获取
    # ===================================================大loop===================================================
    iLoopOuter = 1
    lGoodsPageNos = []
    while shouldContinue:
        # 清除掉network
        pyautogui.moveTo(1544, 145, 2)
        pyautogui.click()

        # 逐步向下滚动鼠标
        pyautogui.moveTo(1207, 581, 2)
        # 50*200
        if iLoopOuter == 1:
            for i in range(1, int(80000 / 1000)):
                pyautogui.scroll(-1000)
                sleep(0.3)
        else:
            for i in range(1, int(40000 / 1000)):
                pyautogui.scroll(-1000)
                sleep(0.3)

        # ★★★★★★★★query_recommend_goods   只要有一次推荐，本次拼多多的就结束了，到底判断逻辑
        # filter textbox
        pyautogui.moveTo(1522, 168, 2)
        pyautogui.doubleClick()

        #
        clip.copy('query_recommend_goods')  # 先复制
        pyautogui.hotkey('ctrl', 'v')  # 再粘贴

        # 选中过滤文件
        pyautogui.moveTo(1540, 325, 2)
        pyautogui.click()

        # 点中json值区域
        pyautogui.moveTo(1812, 497, 2)
        pyautogui.click()

        sleep(2)
        pyautogui.hotkey('ctrl', 'a')

        sleep(2)
        pyautogui.hotkey('ctrl', 'c')

        # bug fix，到第一个页面可能会被遮住
        pyautogui.moveTo(1571, 167, 2)

        # 读取剪切板内容
        sleep(2)
        value = clip.paste()
        # 判断是否是json
        try:
            # json格式
            jsonFromPDD = json.loads(value)
            print("======Loop3:query_recommend_goods为json格式，正式终止所有流程======")
            # print(jsonFromPDD)
            shouldContinue = False
        except Exception:
            # 非json格式
            print("======Loop3:query_recommend_goods为非json格式，继续下一轮Loop======")
            print("非json格式")
            shouldContinue = True

        if iLoopOuter == 1:
            innerLoop = 16
        else:
            innerLoop = 16

        for j in range(0, innerLoop):

            if j == 0:
                # ★★★★★★★★★★★★filter textbox
                pyautogui.moveTo(1522, 168, 2)
                pyautogui.doubleClick()

                clip.copy('query_cat_goods')  # 先复制
                pyautogui.hotkey('ctrl', 'v')  # 再粘贴

            # 选中过滤文件（循环中，唯一有差别的地方）
            pyautogui.moveTo(1540, 325 + j * 21.5, 2)
            pyautogui.click()

            # 点中json值区域
            pyautogui.moveTo(1812, 497, 2)
            pyautogui.click()

            sleep(2)
            pyautogui.hotkey('ctrl', 'a')

            sleep(2)
            pyautogui.hotkey('ctrl', 'c')

            # bug fix，到第一个页面可能会被遮住
            pyautogui.moveTo(1571, 167, 2)

            # 读取剪切板内容query_cat_goods
            sleep(2)
            value = clip.paste()
            # 判断是否是json
            try:
                # json格式
                jsonFromPDD = json.loads(value)
                if jsonFromPDD['page_no'] not in lGoodsPageNos:
                    saveJson(jsonFromPDD, conn)
                    # 这里还缺少一个分支，就算是json格式，有可能是上一个重复的数据，因此在这里要判断小循环的数据是否重复了
                    lGoodsPageNos.append(jsonFromPDD['page_no'])
                else:
                    # 后续就不需要继续抓了，这样节约时间
                    print("******页数重复，本轮内层有循环******")
                    break

                # print(jsonFromPDD)
            except Exception:
                # 非json格式
                continue

        # ==========================================大loop的尾部控制
        iLoopOuter = iLoopOuter + 1
        # 整体大loop休息的地方
        sleep(1)
        # print(jsonFromPDD)

    return


def executeCatchWeb(conn):
    try:
        SPGK(conn)
    except Exception as e:
        traceback.print_exc()
        sendAlert('【异常中断】' + modeName, '异常:' + str(e) + '|报错文件:' + os.path.split(__file__)[-1], engine, conn)
        print('【异常中断】' + modeName, '异常:' + str(e) + '|报错文件:' + os.path.split(__file__)[-1])
        return
    sendFinalSuccessEmail('●正常完成●' + modeName, '', engine, conn, modeName, runMode)


if __name__ == '__main__':
    # 连接database
    engine = create_engine('mysql+pymysql://jsbi:jsbi-1701@47.114.55.19:9011/biv1?charset=utf8')
    con = engine.connect()
    # 本函数调试用
    executeCatchWeb(con)
    pass
